package plus.easydo.server.user.mp.service.impl;

import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import plus.easydo.server.user.mp.dto.OauthClientDetailsDto;
import plus.easydo.server.user.mp.entity.OauthClientDetails;
import plus.easydo.server.user.mp.mapper.OauthClientDetailsMapper;
import plus.easydo.server.user.mp.qo.OauthClientDetailsQo;
import plus.easydo.server.user.mp.service.IOauthClientDetailsService;
import plus.easydo.server.user.mp.vo.OauthClientDetailsVo;
import plus.easydo.starter.oauth.core.utils.Oauth2Utils;
import plus.easydo.utils.ResultConvertUtil;

import java.util.Arrays;
import java.util.List;

/**
 * oauth2客户端信息Service业务层处理
 *
 * @author gebilaoyu
 * @date 2021-05-01
 */
@Service
public class OauthClientDetailsServiceImpl extends ServiceImpl<OauthClientDetailsMapper, OauthClientDetails> implements IOauthClientDetailsService {

    /**
     * 查询oauth2客户端信息
     *
     * @param clientId oauth2客户端信息ID
     * @return oauth2客户端信息
     */
    @Override
    public OauthClientDetailsVo selectOauthClientDetailsById(String clientId)
    {
        OauthClientDetails oauthClientDetails = baseMapper.selectById(clientId);
        return ResultConvertUtil.convertVo(oauthClientDetails,OauthClientDetailsVo::new);
    }

    /**
     * 查询oauth2客户端信息列表
     *
     * @param qo oauth2客户端信息
     * @return oauth2客户端信息
     */
    @Override
    public IPage<OauthClientDetailsVo> page(OauthClientDetailsQo qo)
    {
        IPage<OauthClientDetails> page = qo.startPage();
        IPage<OauthClientDetails> iPage = baseMapper.selectOauthClientDetailsList(page, qo);
        List<OauthClientDetailsVo> voList = ResultConvertUtil.copyList(iPage.getRecords(), OauthClientDetailsVo::new);
        IPage<OauthClientDetailsVo> voPage = new Page<>();
        BeanUtils.copyProperties(iPage,voPage);
        voPage.setRecords(voList);
        return voPage;
    }

    /**
     * 查询oauth2客户端信息列表
     *
     * @param qo oauth2客户端信息
     * @return oauth2客户端信息
     */
    @Override
    public List<OauthClientDetailsVo> list(OauthClientDetailsQo qo) {
        List<OauthClientDetails> list = baseMapper.selectList(Wrappers.query());
        return ResultConvertUtil.copyList(list, OauthClientDetailsVo::new);
    }

    /**
     * 新增oauth2客户端信息
     *
     * @param dto oauth2客户端信息
     * @return 结果
     */
    @Override
    public int insertOauthClientDetails(OauthClientDetailsDto dto) {
        OauthClientDetails oauthClientDetails = OauthClientDetails.builder().build();
        BeanUtils.copyProperties(dto, oauthClientDetails);
        oauthClientDetails.setAdditionalInformation(oauthClientDetails.getClientSecret());
        oauthClientDetails.setClientSecret(Oauth2Utils.encryptPassword(UUID.randomUUID().toString()));
        return baseMapper.insert(oauthClientDetails);
    }

    /**
     * 修改oauth2客户端信息
     *
     * @param dto oauth2客户端信息
     * @return 结果
     */
    @Override
    public int updateOauthClientDetails(OauthClientDetailsDto dto)
    {
        OauthClientDetails oauthClientDetails = OauthClientDetails.builder().build();
        BeanUtils.copyProperties(dto, oauthClientDetails);
        return baseMapper.updateById(oauthClientDetails);
    }

    /**
     * 批量删除oauth2客户端信息
     *
     * @param clientIds 需要删除的oauth2客户端信息ID
     * @return 结果
     */
    @Override
    public int deleteOauthClientDetailsByIds(String[] clientIds)
    {
        return removeByIds(Arrays.asList(clientIds))? 1:0;
    }

    /**
     * 删除oauth2客户端信息信息
     *
     * @param clientId oauth2客户端信息ID
     * @return 结果
     */
    @Override
    public int deleteOauthClientDetailsById(String clientId)
    {
        return removeById(clientId)? 1:0;
    }
}
